/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package server.negocio;

import com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException;
import java.util.logging.Level;
import java.util.logging.Logger;

import server.dominio.ISesion;
import server.dominio.Sesion;
import server.dominio.Usuario;
import java.sql.SQLException;
import java.util.ArrayList;
import server.dominio.Beneficiario;
import server.dominio.Medico;
import server.dominio.Persona;
import server.excepciones.BeneficiarioInexistenteException;
import server.excepciones.MedicoNoExistenteException;
import server.excepciones.MedicoYaExistenteException;
import server.persistencia.DAOFactory;
import server.persistencia.DAOUsuario;
import server.excepciones.UsuarioIncorrectoException;
import server.excepciones.UsuarioYaExistenteException;
import server.persistencia.DAOBeneficiario;
import server.persistencia.DAOMedico;

/**
 *
 * @author tpaxle
 */
public class Fachada_Servidor {
   // private
    private DAOFactory factoriadaos;

    public Fachada_Servidor(){
        factoriadaos= DAOFactory.getFactory(1);
    }

    public ISesion getlogin(String login, String password) throws SQLException, UsuarioIncorrectoException{
        
        ISesion devuelta = null;
        DAOUsuario daou = factoriadaos.crearDAOUsuario();
        ArrayList<Object> usuario =  daou.select("SELECT * FROM usuario WHERE login='"+login+"' and pass= '" + password+"'");
        if(usuario.size()==0){
            //lanzar Usuario no encontrado exception
            throw new UsuarioIncorrectoException("Usuario: "+ login + ". Password: " + password +", no se encuentra en la base de datos");
        }

        Usuario aux= (Usuario)usuario.get(0);
        //NO se como hacer un identificador aleatorio que no este ya en uso.
        devuelta= new Sesion(-1, aux.getRol());
//        return devuelta;
        return devuelta;
    }

    public Beneficiario getBeneficiario(String dni) throws SQLException, BeneficiarioInexistenteException{
        Beneficiario bene= null;
        DAOBeneficiario daoBene= factoriadaos.crearDAOBeneficiario();
        ArrayList<Object> beneficiario = daoBene.select("SELECT * FROM Beneficiario WHERE Nif= '"+dni+"'");
        if(beneficiario.size()==0)
            throw new BeneficiarioInexistenteException(dni);
        else{
            bene= (Beneficiario)beneficiario.get(0);
        }
        return bene;
    }

    Medico getMedico(String dni) throws SQLException, MedicoNoExistenteException {
        Medico medico= null;
        DAOMedico daoMe= factoriadaos.crearDAOMedico();

        ArrayList<Object> medicos= daoMe.select("SELECT * FROM Medico,Persona Where Medico.idPersona_fk= Persona.idPersona and Nif='"+dni+"'");
        if(medicos.size()==0)
            throw new MedicoNoExistenteException(dni);
        else{
            medico= (Medico)medicos.get(0);
        }
        return medico;
    }

    public void nuevobeneficiario(Beneficiario beneficiario) throws SQLException {
        DAOBeneficiario daoBeneficiario= factoriadaos.crearDAOBeneficiario();
        daoBeneficiario.insert(beneficiario);
    }

    public void nuevomedico(Medico medico) throws SQLException, MedicoYaExistenteException {
        DAOMedico daoMedico= factoriadaos.crearDAOMedico();

        try {
            daoMedico.insert(medico);
        } catch (MySQLIntegrityConstraintViolationException ex) {
            //Ya hay un usuario con el mismo nif o el mismo login
            throw new MedicoYaExistenteException(ex.toString());
        }finally{
            daoMedico.cerrarDAO();
        }
    }

    public void nuevousuario(Usuario usuario) throws UsuarioYaExistenteException, SQLException{
        DAOUsuario daoUsuario = factoriadaos.crearDAOUsuario();
        try {
            daoUsuario.insert(usuario);
        } catch (MySQLIntegrityConstraintViolationException ex) {
            throw new UsuarioYaExistenteException();
        } finally{
            daoUsuario.cerrarDAO();            
        }

    }



    public ArrayList<Object> getMedicos() throws SQLException{
        return factoriadaos.crearDAOMedico().select("SELECT * FROM Medico");
    }


        //Si existe beneficiario 1, si existe la persona pero no el beneficiario 0, si no existe nada -1;
    public int existeMedico(Medico medico) throws SQLException{
        //Si existe una persona con ese dni... 0 o 1
        int resultado= -1;
 //      if(this.getPersona(medico.getNif())!= null){
            //Si existe un beneficiario para la persona anterior.
           if(factoriadaos.crearDAOMedico().select("SELECT * FROM Medico, Persona Where Medico.idPersona_fk= Persona.idPersona and nif= '"+medico.getNif()+"'").size()==1)
               resultado= 1;
           else
               resultado= 0;
   //    }
        return resultado;

    }

    public boolean logincorrecto(Usuario datosUsuario) throws SQLException{
        DAOUsuario daousu= factoriadaos.crearDAOUsuario();
        boolean resultado= daousu.select("SELECT * FROM Usuario Where login= '"+datosUsuario.getLogin()+"'").size()==0;
        daousu.cerrarDAO();
        return resultado;
    }

   

    public void actualizar(Beneficiario beneficiario) throws SQLException, BeneficiarioInexistenteException {
        DAOBeneficiario daobene= factoriadaos.crearDAOBeneficiario();

        /*Se comprueba que existe una persona y un beneficiario igual pero sabemos que tenemos los datos del beneficiairo*/
        if(this.getBeneficiario(beneficiario.getNif())!= null){
            daobene.update(beneficiario);
        }
    }

    public void actualizar(Medico medico) throws SQLException, MedicoNoExistenteException {
        DAOMedico daomed= factoriadaos.crearDAOMedico();

        /*Se comprueba que existe una persona y un beneficiario igual pero sabemos que tenemos los datos del beneficiairo*/
        if(this.getMedico(medico.getNif())!= null){
            daomed.update(medico);
        }
    }

    public ArrayList<Object> getUsuarios() throws SQLException {
        ArrayList<Object> usuarios= null;
        DAOUsuario daousuario= factoriadaos.crearDAOUsuario();
        usuarios= daousuario.select("SELECT * FROM Usuario");
        daousuario.cerrarDAO();
        return usuarios;
    }

    public ArrayList<Object> getBeneficiarios() throws SQLException {
        ArrayList<Object> beneficiarios= null;
        DAOBeneficiario daobene= factoriadaos.crearDAOBeneficiario();
        beneficiarios= daobene.select("SELECT * FROM Beneficiario");
        daobene.cerrarDAO();
        return beneficiarios;
    }

    public void modificarPersona(Persona persona_class) throws SQLException{
//        persona_class.setIdPersona(this.getPersona(persona_class.getNif()).getIdPersona());
  //      factoriadaos.crearDAOPersona().update(persona_class);
    }
    

}
